package band.wukong.practice.javase.core.io.stream.filterstream;

import java.io.*;

/**
 * Desc:
 * Author: sunjs
 * Date: 2009-11-16 11:41:07
 */
public class TestBufferedStream {
    static final String FILE_OUT = "E:\\workspace\\TestJava\\src\\com\\jsun\\javase\\io\\doc\\out.txt";

    public static void main(String[] args) throws Exception {
        testBufferedStream();
    }

    public static void testBufferedStream() throws Exception {
        FileOutputStream out1 = new FileOutputStream(FILE_OUT);
        BufferedOutputStream out2 = new BufferedOutputStream(out1, 2);
        DataOutputStream out = new DataOutputStream(out2);

        out.writeUTF("信仰在空中飘扬");
        //out.close();  //为了演示，特意不关闭输出流。


        InputStream in1 = new FileInputStream(FILE_OUT);
        BufferedInputStream in2 = new BufferedInputStream(in1);
        DataInputStream in = new DataInputStream(in2);

        System.out.println(in.readUTF());
        in.close();

        /*
            以上BufferedOutputStream的缓冲区大小为两个字节，在执行out.writeUTF("信仰在空中飘扬")方法时，
            先把字符串的UTF-8字符编码写到缓冲区，当超过两个字节时，再把缓冲区的数据写到文件中。

            如果把缓冲改为256个字节，指定字符串没有超过缓冲区容量，这种情况下BufferedOutputStream是不会自动把
            缓冲区的数据写到文件中。因此，执行完out.writeUTF("信仰在空中飘扬")方法后，文件中并没有任何数据。
            当输入流执行in.readUTF()时，会抛出java.io.EOFException。

            为了保证刷新，有两种办法：
            1.在out.writeUTF("....")之后调用out.flush()方法立即刷新缓冲中的数据到输出流中。
            2.在out.writeUTF("....")之后执行out.close()方法，也会刷新缓冲中的数据到输出流。
         */
    }
}
/*
    DataOutputStream 类与BufferedOutputStream类的区别是什么

DataOutputStream dataout = new DataOutputStream(new FileOutputStream("file"));
BufferedOutputStream dataout1 = new BufferedOutputStream(new FileOutputStream("file"));

DataOutputStream 类与BufferedOutputStream类的区别是什么:
BufferedOutputStream类能够在内存里建立一个缓冲区,当写文件的时候,能起到

缓冲的作用.但是DataOutputStream能像BufferedOutputStream类一样起到缓冲作

用吗?如果有缓冲作用的话,但是DataOutputStream 类的构造函数里,只有一个.而

且其构造函数的参数没有提供出设置缓存大小的参数?

共同点是, 两个类都是java.io.FilterOutputStream的子类, 但是两个类的用途不一样:

[u][b]DataOutputStream[/b][/u]

A data output stream lets an application write primitive Java data types to an output stream in a portable way. An application can then use a data input stream to read the data back in.

所以这个类的方法大多是writeFloat, writeDouble, writeBoolean等等, 与DataInputStream一起使用可以把java的primitive 数据写入读出.

[u][b]BufferedOutputStream[/b][/u]
The class implements a buffered output stream. By setting up such an output stream, an application can write bytes to the underlying output stream without necessarily causing a call to the underlying system for each byte written.

BufferedOutputStream有缓存读写的功能, 而DataOutputStream没有

-->
如果它没有缓存功能的话,那在实际开发工作中,DataOutputStream应用在读取数据库数据的情况,多不多?它有什么实际用途的?如果它没有缓存功能的话?

-->


LZ有看到我发的关于复制文件那帖吗？

请比较一下你原来的，和我发的，效率上的区别。。。

和DataInputStream结合使用, 用来读写primitive java data type, 你作个自定义文件序列化或者socket流传输的时候就会发现很有用了.
http://blog.csdn.net/mingjava/archive/2004/09/16/106130.aspx

http://study.hhstu.edu.cn/JavaV2/JavaGossip-V2/DataInOutStream.htm

*/
